package controlador;

import java.io.Serializable;
import java.util.Vector;

import modelo.CajaAhorro;
import modelo.Cliente;
import modelo.ClienteView;
import modelo.Cuenta;
import modelo.CuentaCorriente;
import modelo.CuentaView;
import modelo.MovimientoView;

public class Banco implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = -1454146666587459320L;

	private Vector<Cliente> clientes;
	private Vector<Cuenta> cuentas;

	public Banco() {
		super();
		clientes = new Vector<Cliente>();
		cuentas = new Vector<Cuenta>();
	}

	public boolean crearCliente(String nombre, long dni, String dom) {
		Cliente c = buscarCliente(dni);
		if (c == null) {
			Cliente cliente = new Cliente(dni, dom, nombre);
			clientes.add(cliente);
			return true;
		}
		return false;
	}

	private Cliente buscarCliente(long dni) {
		for (int i = 0; i < clientes.size(); i++) {
			if (clientes.elementAt(i).tenesElDni(dni))
				return clientes.elementAt(i);
		}
		return null;
	}

	public int crearCajaAhorro(long dni, float intereses) {
		Cliente c = buscarCliente(dni);

		if (c != null) {
			CajaAhorro ca = new CajaAhorro(intereses, c);
			cuentas.add(ca);
			return ca.getNumero();
		}
		return 0;
	}

	public int crearCC(long dni, float desc) {
		Cliente c = buscarCliente(dni);

		if (c != null) {
			CuentaCorriente cc = new CuentaCorriente(c, desc);
			cuentas.add(cc);
			return cc.getNumero();
		}
		return 0;
	}

	public void depositar(int nroCta, float monto) {
		Cuenta cta = buscarCuenta(nroCta);

		if (cta != null) {
			cta.crearDeposito(monto);
		}
	}

	private Cuenta buscarCuenta(int nroCta) {
		for (int i = 0; i < cuentas.size(); i++) {
			if (cuentas.elementAt(i).tenesElNro(nroCta))
				return cuentas.elementAt(i);
		}
		return null;
	}

	public Vector<CuentaView> getCuentas() {
		Vector<CuentaView> ctas = new Vector<CuentaView>();
		for (int i = 0; i < cuentas.size(); i++) {
			ctas.add(cuentas.elementAt(i).getView());
		}
		return ctas;
	}

	public boolean extraer(int nroCuenta, float monto) {
		Cuenta c = buscarCuenta(nroCuenta);

		if (c != null) {
			if (c.sePuedeExtraer(monto)) {
				c.extraer(monto);
				return true;
			}
		}
		return false;
	}

	public Vector<MovimientoView> getMovimientosCta(int nroCta) {
		Cuenta cta = buscarCuenta(nroCta);

		if (cta != null) {
			Vector<MovimientoView> movs = cta.getMovimientosCtaView();
			return movs;
		}
		return null;
	}

	public void modificarCliente(long dni, String nom, String dom,
			boolean activo) {
		Cliente c = buscarCliente(dni);

		if (c != null) {
			c.setNombre(nom);
			c.setDomicilio(dom);
			c.setActivo(activo);
		}
	}

	public ClienteView obtenerVistaCliente(long dni) {
		Cliente cli = buscarCliente(dni);
		if (cli != null) {
			return cli.crearVista();
		}
		return null;
	}

	public void borrarCliente(long dni) {
		Cliente cli = buscarCliente(dni);
		if (cli != null) {
			cli.setActivo(false);
		}
	}

	public CuentaView obtenerCuenta(int nroCta) {
		Cuenta cta = buscarCuenta(nroCta);
		if (cta != null) {
			return cta.getView();
		}
		return null;
	}

	public void cerrarCuenta(int nroCta) {
		Cuenta cta = buscarCuenta(nroCta);
		cta.setEstado(false);
	}
}